﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Entities;
using System.ComponentModel;
using Cesave.Application.Permisos.ServiceAgent;

namespace Cesave.Presentation.Permisos.WinForms.Client.ViewModels.Permisos
{
    /// <summary>
    /// Manejo de secciones.
    /// </summary>
    public partial class ExpedicionViewModel
    {
        #region Private properties

        /// <summary>
        /// Lista de secciones
        /// </summary>
        private List<Seccion> _secciones;

        /// <summary>
        /// Sección del usuario.
        /// </summary>
        private Seccion _seccion;

        #endregion

        #region Public properties

        /// <summary>
        /// Lista de secciones.
        /// </summary>
        public List<Seccion> Secciones
        {
            get
            {
                return _secciones;
            }
            private set
            {
                _secciones = value;
                if (_secciones != null)
                    RaisePropertyChanged("Secciones");
            }
        }

        /// <summary>
        /// Sección del usuario.
        /// </summary>
        public Seccion Seccion
        {
            get
            {
                return _seccion;
            }
            private set
            {
                _seccion = value;
                if (_seccion != null)
                    RaisePropertyChanged("Seccion");
            }
        }

        /// <summary>
        /// Determina si ya se ha identificado la sección del usuario.
        /// </summary>
        public bool IsSeccionReady
        {
            get
            {
                return Seccion != null;
            }
        }

        #endregion

        #region Private methods

        /// <summary>
        /// Carga las secciones del área de influencia seleccionada.
        /// </summary>
        private void LoadSecciones()
        {
            using (BackgroundWorker worker = new BackgroundWorker())
            {
                worker.DoWork += (sender, e) =>
                {
                    var secciones = new List<Seccion>();
                    using (PermisosModuleServiceWrapper service = new PermisosModuleServiceWrapper())
                    {
                        AreaSecciones.ForEach(areaSeccion =>
                        {
                            var seccion = service.FindSeccionByGuid(areaSeccion.SeccionGuid);
                            secciones.Add(seccion);
                        });
                    }
                    e.Result = secciones;
                };
                worker.RunWorkerCompleted += (sender, e) =>
                {
                    if (!e.Cancelled && e.Error == null)
                        Secciones = e.Result as List<Seccion>;
                    else if (e.Error != null)
                        ShowMessage(e.Error.Message);
                };
                worker.WorkerSupportsCancellation = true;
                worker.RunWorkerAsync();
            }
        }

        /// <summary>
        /// Valida que la sección del usuario esté contenida en las secciones
        /// del área.
        /// </summary>
        /// <returns></returns>
        private bool ValidateSeccion()
        {
            if (Secciones.Count() == 0)
                return false;
            if (!IsSeccionReady)
                return false;
            return Secciones.Any(s => s.SeccionGuid == Seccion.SeccionGuid);
        }

        #endregion

        #region Event methods

        /// <summary>
        /// Identifica la sección actual de acuerdo al usuario.
        /// </summary>
        private void SetCurrentSeccion()
        {
            using (BackgroundWorker worker = new BackgroundWorker())
            {
                worker.DoWork += (sender, e) =>
                {
                    using (PermisosModuleServiceWrapper service = new PermisosModuleServiceWrapper())
                    {
                        e.Result = service.FindSeccionByGuid(Usuario.SeccionGuid);
                    }
                };
                worker.RunWorkerCompleted += (sender, e) =>
                {
                    if (!e.Cancelled && e.Error == null)
                        Seccion = e.Result as Seccion;
                };
            }
        }

        /// <summary>
        /// Se ejecuta cuando la propiedad Secciones cambia de valor.
        /// </summary>
        private void OnSeccionesPropertyChanged()
        {
            ValidateSeccion();
        }

        /// <summary>
        /// Se ejecuta cuando la propiedad Seccion cambia de valor.
        /// </summary>
        private void OnSeccionPropertyChanged()
        {
            ValidateSeccion();
        }

        #endregion

    }
}
